iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

Terraform 繁體中文系列 第 25

Day25-【入門教程】taint, validate, untaint, workspace(list, delect, new, delete, show)

  • 分享至 

  • xImage
  •  

原簡體中文教程連結: Introduction.《Terraform入門教程》


1.6.19.1. taint

terrform taint 指令可以手動標記某個 Terraform 管理的資源有"污點",強迫在下次執行 apply 時刪除並重建之。

該指令並不會修改基礎設施,而是在狀態檔案中的某個資源物件上標記污點。當一個資源物件被標記了污點,在下一次 plan 操作時會計畫將之刪除並且重建,apply 操作會執行這個變更。

強迫重建某個資源可以讓你能夠觸發某種副作用。舉例來說,你想重新執行某個預置器操作,或是某些人繞過 Terraform 修改了虛擬機器狀態,而你想將虛擬機器重置。

注意為某個資源標記污點並重建之會影響到所有依賴該資源的物件。舉例來說,一筆 DNS 記錄使用了伺服器的 IP 位址,我們在伺服器上標記污點會導致 IP 改變進而影響到 DNS 記錄。這種情況下可以使用 plan 指令查看變更計劃。

1.6.19.1.1. 用法

terraform taint [options] ADDRESS

ADDRESS 參數是要標記污點的資源位址。

此命令可以使用如下可選參數:

  • -allow-missing:如果宣告該參數,那麼即使資源不存在,指令也會回傳成功(狀態碼0)
  • -backup=path:寫入備份檔案的路徑,預設為 -state-out 路徑加上 ".backup"後綴。可以透過設定為 "-" 關閉備份
  • -lock=true:與 apply 類似,不再贅述
  • -lock-timeout=0s:與 apply 類似,不再贅述
  • -state=path:要讀寫的狀態檔案路徑。預設為 "terraform.tfstate"。如果啟用了遠端 Backend 則該參數設定無效
  • -state-out=path:更新後的狀態檔案寫入的路徑。預設等於 -state 路徑。如果啟用了遠端 Backend 則該參數設定無效

1.6.19.1.2. 標記單一資源

$ terraform taint aws_security_group.allow_all
The resource aws_security_group.allow_all in the module root has been marked as tainted.

1.6.19.1.3. 標記使用for_each建立的資源的特定實例

$ terraform taint "module.route_tables.azurerm_route_table.rt[\"DefaultSubnet\"]"
The resource module.route_tables.azurerm_route_table.rt["DefaultSubnet"] in the module root has been marked as tainted.

1.6.19.1.4. 標記模組中的資源

$ terraform taint "module.couchbase.aws_instance.cb_node[9]"
Resource instance module.couchbase.aws_instance.cb_node[9] has been marked as tainted.

雖然我們推薦模組深度不要超過 1,但我們仍然可以標記多層模組中的資源:

$ terraform taint "module.child.module.grandchild.aws_instance.example[2]"
Resource instance module.child.module.grandchild.aws_instance.example[2] has been marked as tainted.

1.6.20.1. validate

terraform validate 指令可以檢查目錄下 Terraform 程式碼,只檢查語法文件,不會存取遠端 Backend、Provider 的 API 等遠端資源。

validate 檢查程式碼的語法是否合法且一致,不管輸入變數以及現存狀態。

validate 指令需要已初始化的工作目錄,所有引用的外掛程式與模組都被安裝完畢。如果只想檢查語法而不想與 Backend 交互,可以這樣初始化工作目錄:

$ terraform init -backend=false

1.6.20.1.1. 用法

terraform validate [options] [dir]

預設情況下 validate 指令不需要任何參數就可以在目前工作目錄下進行檢查。

可使用如下可選參數:

  • -json:使用 JSON 格式輸出機器可讀的結果
  • -no-color:禁止使用彩色輸出

1.6.21.1. untaint

terraform untaint 指令可以手動清除一個 Terraform 管理的資源物件上的污點,恢復它在狀態檔案中的狀態。它是 terraform taint 的逆向操作。

此指令不會修改實際的基礎設施資源,只會在資源檔案中清除資源物件上的污點標記。

1.6.21.1.1. 用法

terraform untaint [options] name

name 參數是要清除污點的資源的資源名稱。此參數的格式為 TYPE.NAME,例如 aws_instance.foo

可使用如下可選參數:

  • -allow-missing:如果宣告該參數,那麼即使 name 指定的資源不存在,指令執行也會回傳成功(狀態碼 0)。命令執行仍然可能報錯,但只在發生嚴重錯誤時
  • -backup=path:寫入備份檔案的路徑。預設為 -state-out 路徑加上 ".backup" 後綴。設定為 "-" 可關閉備份
  • -lock=true:類似 apply,不再贅述
  • -lock-timeout=0s:類似 apply,不再贅述
  • -module=path:資源所在模組的名稱。預設使用根模組。可透過 "." 號分隔的路徑指定模組,例如 "foo" 指定使用 foo 模組,"foo.bar" 指定使用 foo 模組中的 bar 模組
  • -no-color:類似 apply,不再贅述
  • -state=path:讀寫的狀態檔案路徑。預設為 "terraform.tfstate"。使用遠端 Backend 時此參數設定無效
  • -state-out=path:修改後的狀態檔案的寫入路徑。預設使用 -state 參數。使用遠端 Backend 時此參數設定無效

1.6.22.1. workspace

terraform workspace 指令可以用來管理目前使用的工作區。我們在狀態管理章節中介紹過工作區的概念。

指令包含一系列子指令,我們將會一一介紹。


1.6.22.1.1. list

terraform workspace list 指令列出目前存在的工作區。

1.6.22.1.1.1. 用法

terraform workspace list

此指令會列印出存在的工作區。目前工作會使用*號標記:

$ terraform workspace list
  default
* development
  jsmith-test

1.6.22.2.1. select

terraform workspace select指令用來選擇使用的工作區。

1.6.22.2.1.1. 用法

terraform workspace select [NAME]

NAME 指定的工作區必須已經存在:

$ terraform workspace list
  default
* development
  jsmith-test

$ terraform workspace select default
Switched to workspace "default".

1.6.22.3.1. new

terraform workspace new 指令用來建立新的工作區。

1.6.22.3.1.1. 用法

terraform workspace new [NAME]

該命令使用給定名字來建立一個新的工作區。不可存在同名工作區。

如果使用了 -state 參數,那麼給定路徑的狀態檔案會被拷貝到新工作區。

此命令支援以下可選參數:

  • -state=path:用來初始化新環境所使用的狀態檔路徑

建立新工作區:

$ terraform workspace new example
Created and switched to workspace "example"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

使用狀態檔案建立新工作區:

$ terraform workspace new -state=old.terraform.tfstate example
Created and switched to workspace "example".

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

1.6.22.4.1. delete

terraform workspace delete 指令被用來刪除已經存在的工作區。

1.6.22.4.1.1. 用法

terraform workspace delete [NAME]

被刪除的工作區必須已經存在,並且無法刪除目前正在使用的工作區。如果工作區狀態不是空的,Terraform 會禁止刪除,除非宣告 -force 參數。

如果使用 -force 刪除非空狀態,那麼這些資源餓狀態出於 "dangling",也就是實際基礎設施資源仍然存在,但脫離了 Terraform 的管理。有時我們希望這樣,只是希望目前 Terraform 專案不再管理這些資源,交由其他專案管理。但大多數情況下並非這樣,所以 Terraform 預設會禁止刪除非空白工作區。

此命令可以使用如下可選參數:

  • -force:刪除含有非空狀態檔案的工作區。預設為 false
    例子:
$ terraform workspace delete example
Deleted workspace "example".

1.6.22.5.1. show

terraform workspace show 指令被用來輸出目前使用的工作區。

1.6.22.5.1.1. 用法

terraform workspace show

例子:

$ terraform workspace show
development

原簡體中文教程連結: Introduction.《Terraform入門教程》


上一篇
Day24-【入門教程】state(list, mv, pull, push, replace-provider, rm, show)
系列文
Terraform 繁體中文25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言